21.4 Das Menü in einer MDI-Anwendung
 
Bevor wir uns das Verhalten eines Menüs einer MDI-Anwendung ansehen und die Einflussnahme darauf, müssen ein paar Worte vorweg gesagt werden. Nach dem, was Sie in Kapitel 18 erfahren haben, sind Sie sicherlich dazu geneigt, die Positionierung und Anordnung von Menü-, Symbol- und Statusleiste einem ToolStripContainer anzuvertrauen. Vertrauen Sie diesem Steuerelement aber nicht zu viel. Denn sobald Sie diesen Container in den Arbeitsbereich eines MDI-Hauptfensters gelegt haben, verliert das Hauptfenster seine für ihn typischen Eigenschaften hinsichtlich der Verwaltung und Anzeige der Subfenster. Das äußert sich dadurch, dass Subfenster gar nicht mehr sichtbar sind. Sie müssen demnach auf einen ToolStripContainer im MDI-Hauptfenster verzichten und können nicht von dessen Fähigkeiten profitieren.
21.4.1 Subfenster anordnen
 
Haben Sie im MDI-Hauptfenster mehrere Subfenster geöffnet, werden diese standardmäßig überlappend angezeigt. Das erste öffnet sich in der linken, oberen Ecke des Hauptfensters, jedes weitere um jeweils einen bestimmten Betrag nach rechts unten versetzt. Wollen Sie dem Benutzer die Möglichkeit geben, die Subfenster anders anzuordnen, haben Sie noch zwei andere Alternativen: entweder werden die Fenster nebeneinander oder untereinander angeordnet. Üblicherweise wird die Wahl über das Menü Fenster des Hauptfensters bereitgestellt (siehe Abbildung 21.2).
 Hier klicken, um das Bild zu vergrößern
Abbildung 21.2 Auswahlmenü zur Anordnung der MDI-Subfenster
Im Ereignishandler des Click-Ereignisses der Menüelemente wird dazu die Methode LayoutMdi des Hauptfensters aufgerufen:
| public void LayoutMdi(MdiLayout value);
|
Der Übergabewert vom Typ MdiLayout kann vier verschiedene Werte aufweisen, welche die Anordnung der Subfenster beschreiben.
Tabelle 21.1 Mitglieder der Enumeration »MdiLayout«
| Member
|
Wert
|
Beschreibung
|
| Cascade
|
0
|
Die im MDI-Hauptfenster angezeigten Subfenster werden überlappend angeordnet.
|
| TileHorizontal
|
1
|
Die im MDI-Hauptfenster angezeigten Subfenster werden horizontal angeordnet.
|
| TileVertical
|
2
|
Die im MDI-Hauptfenster angezeigten Subfenster werden vertikal angeordnet.
|
| ArrangeIcons
|
3
|
Alle iconisierten Subfenster werden am unteren Rand des Hauptfensters angeordnet.
|
Ein gemeinsamer Ereignishandler reicht aus, um alle Subfenster wunschgemäß anzuordnen. Sie prüfen dann in einer if-Anweisung den Parameter sender, um festzustellen, welches Menüelement den Aufruf des Handlers ausgelöst hat. Mit der gewonnenen Information weisen Sie den entsprechenden Enumerationswert der Eigenschaft LayoutMdi zu.
| // Gemeinsamer Ereignishandler der Menüelemente zur überlappenden,
|
| // horizontalen und vertikalen Anordnung der Subfenster
|
| private void ArrangeSubWindows(object sender, EventArgs e) {
|
| if (sender == menuUeberlappend)
|
| this.LayoutMdi(MdiLayout.Cascade);
|
| else if (sender == menuUntereinander)
|
| this.LayoutMdi(MdiLayout.TileHorizontal);
|
| else
|
| this.LayoutMdi(MdiLayout.TileVertical);
|
| }
|
Sie werden feststellen, dass sich die Anordnung der untergeordneten Fenster nicht blindlings an Ihren Wünschen orientiert, sondern als nicht beeinflussbaren Faktor auch die Anzahl der Subfenster berücksichtigt. Sind beispielsweise vier untergeordnete Fenster geöffnet und wird die Anweisung gegeben, alle horizontal anzuordnen, werden nicht alle vier Fenster untereinander angezeigt. Stattdessen werden je zwei Fenster neben- und untereinander ausgegeben. Die Anordnung entspricht genau der, die man auch bei vier Subfenstern erhalten würde, wenn eine vertikale Anordnung gewünscht wird.
21.4.2 Subfenster mit eigenen Menüs
 
Subfenster können genauso wie MDI-Hauptfenster eine eigene Menüleiste haben. Allerdings wird diese nicht im Sub-, sondern im Hauptfenster angezeigt. Dabei wird die Menüleiste des Hauptfensters um die Menüleiste des Subfensters ergänzt. Die Anordnung der Menüelemente in der kombinierten Menüleiste kann unterschiedlich ausfallen, per Vorgabe wird die Menüleiste des Hauptfensters rechts um die Menüleiste des Subfensters ergänzt.
Die Standardeinstellung kann verändert werden, und das praktisch ohne Einschränkungen. Sie können die beiden Menüleisten beliebig kombinieren, Menüelemente ausblenden, Menüelemente im Hauptfenster durch Untermenüs des Subfensters ergänzen, usw.
Um das Verhalten des Zusammenführens von zwei Menüleisten zu steuern, stehen Ihnen mit MergeAction und MergeIndex zwei Eigenschaften der Menüelemente zur Verfügung. Die Einstellungen dieser Eigenschaften wirken sich aber auch nur dann aus, wenn das MenuStrip-Objekt mit AllowMerge=true ein Zusammenführen zulässt. Das ist aber die Vorgabe und braucht daher nur umgeschaltet zu werden, wenn das Zusammenführen der Menüleisten nicht gewünscht ist.
MergeAction beschreibt, wie die beiden Menüleisten kombiniert werden. Dabei sind Einstellungen möglich, die in der gleichnamigen Enumeration festgelegt sind.
Tabelle 21.2 Die Mitglieder der Enumeration »MergeAction«
| Wert
|
Beschreibung
|
| Append
|
Das Menüelement wird der Menüleiste im Hauptfenster angehängt.
|
| Insert
|
Fügt ein Menüelement an der unter MergeIndex spezifizierten Position ein.
|
| MatchOnly
|
Das Untermenü des Menüelements wird an das Untermenü im Hauptfenster angehängt, dessen Position durch MergeIndex beschrieben wird.
|
| Remove
|
Das Menüelement ist in einem zusammengeführten Menü nicht enthalten.
|
| Replace
|
Das Menüelement ersetzt vollständig das unter MergeIndex angegebene des Hauptfensters.
|
MergeAction.Append hängt das Menüelement direkt hinter dem rechts außen stehenden Menüelement des Hauptfensters an. Sollten keine Änderungen an der Eigenschaft MergeAction der Subfenster-Menüelemente vorgenommen worden sind, wird die komplette Subfenster-Menüleiste auf diese Weise in die Menüleiste des Hauptfensters eingespielt.
Wollen Sie Einfluss auf die angezeigte Reihenfolge nehmen, könnte MergeAction.Insert die passende Wahl sein. Sie müssen allerdings dann auch unter der Eigenschaft MergeIndex die Position des Menüelements in der zusammengeführten Menüleiste angeben. Bedenken Sie, dass alle Menüelemente von einer Auflistung des MenuStrip-Objekts verwaltet werden. Geben Sie
| MergeAction = Insert
|
| MergeIndex = 1
|
an, wird das Menüelement als zweites im zusammengeführten Menü des Hauptfensters angezeigt.
Angenommen, im Hauptfenstermenü gibt es ein Menüelement Datei und im Subfenster ebenfalls. Die Intention, auch im Subfenster ein Datei-Menüelement bereitzustellen, könnte die Absicht sein, dass des Hauptfensters zu ersetzen. Was ist zu tun? Nun, zuerst stellen Sie im Eigenschaftsfenster
ein und unter MergeIndex den Index des Elements in der Collection, das ersetzt werden soll. Da Datei meist links außen zu finden ist und damit auch die erste Position in der ToolStripItemCollection einnimmt, müsste
zum Ziel führen.
Im Subfenster ein Datei-Menüelement vorzusehen, könnte aber auch der Idee entspringen, das ursprüngliche Datei-Menü im Hauptfenster durch passende Einträge zu ergänzen, um den spezifischen Anforderungen des Subfensters zu genügen. Auch das ist kein Problem. Unter MergeIndex geben Sie den Index des Menüelements an, der ergänzt werden soll, und MergeAction legen Sie auf MatchOnly fest. Es ist übrigens nicht zwingend erforderlich, dass das zu ergänzende Menüelement denselben Bezeichner hat wie das Menüelement, dessen Unterelemente ergänzend zusammengeführt werden.
| Hinweis Auch wenn wir hier nur die Menüelemente der Menüleiste und deren Zusammenführen im Hauptfenster erörtert haben, Sie können auch die Unterelemente ganz nach Ihren Vorstellungen anordnen und kombinieren.
|
|